package com.snowfield.lbcommon.utils;

import java.util.*;

/**
 * Created by lxk on 2017/5/2
 * 代码来自网络，感谢lxk
 */
public class OrderedProperties extends Properties {
    private static final long serialVersionUID = -4627607243846121965L;

    /**
     * 因为LinkedHashSet有序，所以，key在调用put()的时候，存放到这里也就有序。
     */
    private final LinkedHashSet<Object> keys = new LinkedHashSet<>();

    @Override
    public Enumeration<Object> keys() {
        return Collections.enumeration(keys);
    }

    /**
     * 在Properties类读取或者写数据到文件时，都会调用put方法。
     * 又在读取时，是按文件内容的顺序读取数据，所以在此时通过有序的集合来记录key，既可实现有序读写数据。
     *
     * 在put的时候，只是把key有序的存到{@link OrderedProperties#keys}
     * 取值的时候，根据有序的keys，可以有序的取出所有value
     *
     * 依然调用父类的put方法,也就是key value 键值对还是存在hashTable里.
     * 只是现在多了个存key的属性{@link OrderedProperties#keys}
     */
    @Override
    public Object put(Object key, Object value) {
        keys.add(key);
        return super.put(key, value);
    }

    /**
     * 重写此方法，在使用stringPropertyNames方法遍历key的时候,输出有序。
     */
    @Override
    public Set<String> stringPropertyNames() {
        Set<String> set = new LinkedHashSet<>();
        for (Object key : this.keys) {
            set.add((String) key);
        }
        return set;
    }

    /**
     * 重写此方法，在使用keySet方法遍历key的时候,输出有序。
     */
    @Override
    public Set<Object> keySet() {
        return keys;
    }

    /**
     * 重写此方法，在使用propertyNames方法遍历key的时候,输出有序。
     */
    @Override
    public Enumeration<?> propertyNames() {
        return Collections.enumeration(keys);
    }

    /**
     * 查看是否包含属性key
     * @param key
     * @return
     */
    public Boolean hasProperty(String key){
        if (keys.contains(key)){
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }
}